extern crate proc_macro;

use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, DeriveInput};

#[proc_macro_derive(HelloMacro)]
pub fn hello_macro_derive(input: TokenStream) -> TokenStream {
    // 将输入 TokenStream 解析成 syn 的 AST 结构
    let ast: DeriveInput = parse_macro_input!(input as DeriveInput);
    // 构造实现代码，再转回 proc_macro::TokenStream
    impl_hello_macro(&ast).into()
}

// 真正生成 impl 代码的函数
fn impl_hello_macro(ast: &syn::DeriveInput) -> TokenStream {
    let name = &ast.ident;
    let tokens  = quote! {
        impl HelloMacro for #name {
            fn hello_macro() {
                println!("Hello, Macro! My name is {}!", stringify!(#name));
            }
        }
    };
    tokens .into()
}
